<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 创建对象的三种方式
    // 1.通过 new Object() 创建对象
    const obj = new Object()

    // 2.通过字面量创建对象
    const obj1 = {}

    // 3.利用构造函数创建对象
    var that
    function Fn(name, age) {
        this.name = name;
        this.age = age;
        // 公共的函数方法

        this.school = '理工'
        that = this
    }
    // Fn.prototype.sing = function () {
    //     console.log(123);
    // }

    Fn.prototype = {
        //如果我们修改了原来的原型对象，给原型对象赋值的是一个对象，则必须手动利用constructor指回原来的构造函数
        constructor: Fn,
        sing: function () { //将sing方法放在原型对象上
            console.log('我会唱歌');
        },
        movie: function () {
            console.log('我是演员');
        }
    }
    Object.prototype.sex = '男3'
    console.dir(Fn)
    const sq = new Fn('给影子告白', 30)
    console.log('55', that === sq);  //原型对象this的指向调用的实例对象
    console.log(sq);
    sq.sing()//访问实例成员
    console.log(sq.sex);
    // sq.movie()

    // 构造函数中的属性和方法称为成员,分为实例成员 和 静态成员
    // 1.实例成员只能通过实例化的对象来访问
    // 2.静态成员 在构造函数本身上添加
    // 例如：
    Fn.sex = '女', //添加静态属性
        Fn.play = function () {  //添加静态方法
            console.log('我喜欢玩');
        }
    // 静态成员只能通过构造函数来访问
    console.log(Fn.sex);//访问静态属性
    Fn.play() //访问静态方法

    console.log(Fn.prototype.constructor);
    console.log(sq.__proto__.constructor);

</script>

</html>